<?php

namespace App\Http\Controllers\home;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use DB;
use Hash;
use Mail;


class RegistoController extends Controller
{
    /**
     *  前台注册页面
     */
    public function getIndex(){
        // 加载模板
        return view('home.registo.index');
    }

    /**
    *   前台邮箱注册操作
    */
    public function postInsertemail(Request $request)
    {   
        $this -> validate($request,
          [
            'username' => 'required',
            'password' => 'required',
            'repassword' => 'required|same:password',
            'code' => 'required',
         
          ],
          [
            'username.required' => '账号不能为空',
            'password.required' => '密码不能为空',
            'repassword.required' => '确认密码不能为空',
            'repassword.same' => '两次密码输入一致',
            'code.required' => '请输入验证码',
           
          ]);

        // 判断验证码是否正确
        if (session('code') != $request -> input('code')) {
            return back() -> with('error','验证码不正确');
        };

        // 获取注册页面提交的信息
        $data = $request -> only('username','password');

        // 查询用户名是否存在
        $res1 = DB::table('user') -> where('username','=',$data['username']) -> first();

        if ($res1) {
            return back() -> with('error','用户名已存在');
        }

        // 密码加密
        $data['password'] = Hash::make($data['password']);

        // 注册时间
        $data['ctime'] = time();

        // 生成token值 账号激活用的随机字符
        $data['token'] = str_random(50);

        // 状态
        $data['status'] = 1;
        $data['activate'] = 1;
        
        // 往数据库里插入的数据 并返回主键ID
        $userid = DB::table('user') -> insertGetId($data);

        // 判断是否注册成功
        if ($userid) {
            // 调用发送邮件的方法
            self::sendemail($data,$userid);

            // 注册成功 并跳转
            return redirect('/home/registo') -> with('email_success','注册成功，请在24小时内查看注册邮箱并激活');
        } else {
            return back() -> with('error','注册失败');
        }
    }

    /**
    *   发送邮件的方法
    */

    static public function sendemail($data,$id)
    {
        Mail::send('emails.email', ['id' => $id,'data' => $data] ,function($m) use($data) {
            $m -> to($data['username'],'亲爱的用户') -> subject('账号注册成功 请激活');
        });
   }
   
    /**
    *   用户激活后根据传过来的ID和token值修改用户状态
    */
    public function getUserstart(Request $request)
    {
        // 接受用户激活传的数据
        $arr = $request -> only('id','token');

        // 查询数据表中用户的token值
        $res1 = DB::table('user') -> where('id','=',$arr['id']) -> select('token') -> first();

        // 判断查询的token值和接受的token值是否相同
        if ($arr['token'] == $res1['token']) {


            // 用户激活要修改的数据
            $data['status'] = 0;
            $data['activate'] = 0;
            $data['token'] = str_random(50);

            // 修改数据表里用户的数据
            $res = DB::table('user') ->where('id','=',$arr['id']) -> where('token','=',$arr['token']) -> update($data);
            
            // 判断激活是否成功
            if ($res) {
                // 往用户详情表里插入用户ID
                DB::table('userdetail') -> insert(['uid'=>$arr['id']]);

                // 往账户余额表添加
                DB::table('vault') ->insert(['uid'=>$arr['id']]);

                return redirect('/home/registo/registosuccess?registosuccess=3');
            } else {
                return redirect('/home/registo/registosuccess?registosuccess=4');
            } 
        }
    }



    /**
    *   前台手机号注册操作
    */
    public function postInsertphone(Request $request)
    {   
        $this -> validate($request,
          [
            'username' => 'required',
            'password' => 'required',
            'repassword' => 'required|same:password',
            'code' => 'required',
         
          ],
          [
            'username.required' => '账号不能为空',
            'password.required' => '密码不能为空',
            'repassword.required' => '确认密码不能为空',
            'repassword.same' => '两次密码输入一致',
            'code.required' => '请输入验证码',
           
          ]);

        // 判断验证码是否正确
        if (session('phoneCode') != $request -> input('code')) {
            return back() -> with('error','验证码不正确,请重新获取');
             // 将错误信息删除
            session() -> forget('phoneCodeError');
            return back();
        };

        // 将短信验证码注销掉 防止重复使用
        session() -> forget('phonecode');

        // 获取注册页面提交的信息
        $data = $request -> only('username','password');

        // 查询用户名是否存在
        $res1 = DB::table('user') -> where('username','=',$data['username']) -> first();

        if ($res1) {
            return back() -> with('error','用户名已存在');
        }

        // 密码加密
        $data['password'] = Hash::make($data['password']);

        // 注册时间
        $data['ctime'] = time();

        // 生成token值 账号激活用的随机字符
        $data['token'] = str_random(50);

        // 状态
        $data['status'] = 0;
        $data['activate'] = 0;
        
        // 往数据库里插入的数据 并返回主键ID
        $id = DB::table('user') -> insertGetId($data);

        // 判断是否注册成功
        if ($id) {
            // 往用户详情表里插入用户ID
            DB::table('userdetail') -> insert(['uid'=>$id]);

            // 往账户余额表添加
            DB::table('vault') ->insert(['uid'=>$id]);
            
            // 注册成功 并跳转
            return redirect('/home/registo/registosuccess?registosuccess=1');
        } else {
            return redirect('/home/registo/registosuccess?registosuccess=2');
        }
    }

    /**
    *   post方式提交
    */
    public function postPhone()
    {
        self::phone();
    }

    /**
    *   发送手机验证码开始
    */
    static public function phone()
    {
        //短信接口地址
        $target = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";
        //获取手机号
        $mobile = $_POST['mobile'];
        session(['phoneCode'=>mt_rand(1000,9999)]);
        //生成的随机数
        $mobile_code = session('phoneCode');
        if(empty($mobile)){
            exit('手机号码不能为空');
        }
        
        $post_data = "account=C65463448&password=124702297dd840b8a672b2e1890e92d8&mobile=".$mobile."&content=".rawurlencode("您的验证码是：".$mobile_code."。请不要把验证码泄露给其他人。");
        //用户名请登录用户中心->验证码、通知短信->帐户及签名设置->APIID
        //查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY
        $gets =  self::xml_to_array(self::Post($post_data, $target));
        if($gets['SubmitResult']['code']==2){
            $_SESSION['mobile'] = $mobile;
        }
        echo $gets['SubmitResult']['msg'];
    }

    /**
    *   将 xml数据转换为数组格式。
    */
    static public function xml_to_array($xml)
    {
        $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
        if(preg_match_all($reg, $xml, $matches)){
            $count = count($matches[0]);
            for($i = 0; $i < $count; $i++){
            $subxml= $matches[2][$i];
            $key = $matches[1][$i];
                if(preg_match( $reg, $subxml )){
                    $arr[$key] = self::xml_to_array( $subxml );
                }else{
                    $arr[$key] = $subxml;
                }
            }
        }
        return $arr;
    }

    /**
    *   请求数据到短信接口，检查环境是否 开启 curl init。
    */
    static public function Post($curlPost,$url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        $return_str = curl_exec($curl);
        curl_close($curl);
        return $return_str;
    }

    public function getRegistosuccess(Request $request)
    {
        $arr = $request -> input('registosuccess');
        
        if ($arr == 1) {
            $data['title'] = 1;
            $data['content'] = '注册成功';
            $data['time'] = '3';
            $data['url'] = '/home/login';
        } elseif ($arr == 2) {
            $data['title'] = 2;
            $data['content'] = '注册失败';
            $data['time'] = '3';
            $data['url'] = '/home/registo';
        } elseif ($arr == 3) {
            $data['title'] = 1;
            $data['content'] = '激活成功';
            $data['time'] = '3';
            $data['url'] = '/';
        } elseif ($arr == 4) {
            $data['title'] = 2;
            $data['content'] = '激活失败';
            $data['time'] = '3';
            $data['url'] = '/';
        }
        
        return view('home.registo.registosuccess',['data'=>$data]);
    }

    /**
    *   加载协议
    */
    public function getAgreement()
    {
        return view('home.registo.agreement');
    }
}
